const Router = require('koa-router')
const jwt = require('jsonwebtoken')
const passport = require('koa-passport')
// 加密中间件
const bcrypt = require('bcryptjs')
// 引入secretOrkey
const secretOrkey = require('../../config/env').secretOrkey

const adminsRouter = new Router()
// 引入Admins数据库模块
const Admins = require('../../models/Admins')
// 引入Roles数据库模块
const Roles = require('../../models/Roles')
adminsRouter.get('/',async (ctx) =>{
    ctx.status = 200
    ctx.body = {
        status:200,
        data:{
            value:"admins首页"
        }
    }
})

/**
 * @route POST api/admins/register
 * @description 注册接口
 * @access      接口公开
 */
adminsRouter.post('/register',async (ctx) =>{
    // 操作数据库,查看是否名字已被注册
    const findData = await Admins.find({
        name:ctx.request.body.name
    })
    if(findData.length !== 0 ){
        ctx.status = 403
        ctx.body = {
            status: 403, 
            msg: '此用户名已被注册'
        }
    }else{
        // 正确执行时
        const newAdmin = new Admins({
            name : ctx.request.body.name,
            password : ctx.request.body.password,
            phone : ctx.request.body.phone,
            age:ctx.request.body.age,
            sex:ctx.request.body.sex,
            address:ctx.request.body.address,
            super:ctx.request.body.super, //是否为超级管理员
            workNumber:ctx.request.body.workNumber, // 工号
        })
        // 加密
        const salt = bcrypt.genSaltSync(10)
        const hash = bcrypt.hashSync(newAdmin.password, salt)
        newAdmin.password = hash

        // 存储到数据库
        newAdmin.save()

        // 向客户端返回数据
        ctx.status = 200
        ctx.body = {
            status:200,
            success:true,
            msg:'注册成功'
        }
    }
    
})
/**
 * @route POST api/admins/login
 * @description 登录接口 返回token
 * @access      接口公开
 */
adminsRouter.post('/login',async (ctx) =>{
    // 查看是否有该用户
    const findData = await Admins.find({
        name:ctx.request.body.name
    })
    // 没有此用户时
    if(findData.length == 0){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'用户不存在！',
            success:false
        }
    }else{
        // 查到用户后验证密码
        const admin = findData[0]
        const password = ctx.request.body.password
        const compaireResult = bcrypt.compareSync(password, admin.password)
        // 密码正确
        if(compaireResult){
            // 生成token
            const payload = {
                id:admin._id,
                name:admin.name
            }
            const token = jwt.sign(payload,secretOrkey,{ expiresIn: 3600 })
            ctx.status = 200
            ctx.body = {
                status:ctx.status,
                success:true,
                msg:'登陆成功！',
                data:{
                    token
                }
            }
        }else{
            ctx.status = 403
            ctx.body = {
                status:ctx.status,
                success:false,
                msg:'密码错误！'
            }
        }
        
    }
})
/**
 * @route POST api/admins/modify
 * @description 修改admin信息接口
 * @access      接口公开
 */
adminsRouter.post('/modify', async (ctx) =>{
        if(ctx.request.body.sameUserName === true){
            let update = {}
            ctx.request.body.username && (update.username = ctx.request.body.username)
            ctx.request.body.password && (update.password = ctx.request.body.password)
            ctx.request.body.fullname && (update.fullname = ctx.request.body.fullname)
            ctx.request.body.age && (update.age = ctx.request.body.age)
            ctx.request.body.address && (update.address = ctx.request.body.address)
            ctx.request.body.phone && (update.phone = ctx.request.body.phone)
            ctx.request.body.message && (update.message = ctx.request.body.message)
            ctx.request.body.sex && (update.sex = ctx.request.body.sex)
            // 加密
            if(update.password !== undefined){
                const salt = bcrypt.genSaltSync(10)
                const hash = bcrypt.hashSync(update.password, salt)
                update.password = hash
            }
            // 存储到数据库
            await Admins.findByIdAndUpdate(ctx.request.body._id, update, { new: true })
            // 向客户端返回数据
            ctx.status = 200
            ctx.body = {
                status : ctx.status,
                success:true,
                data:{
                    update
                },
                msg:'用户信息更新成功'
            }
        }else{
            // 查看是否有该用户名
            const findData = await Admins.find({
                username:ctx.request.body.username
                })
                if(findData.length !== 0 ){
                    ctx.status = 403
                    ctx.body = {
                        status: 403, 
                        msg: '此用户名已被注册,请重新修改用户名'
                }
        }else{
            let update = {}
            ctx.request.body.username && (update.username = ctx.request.body.username)
            ctx.request.body.password && (update.password = ctx.request.body.password)
            ctx.request.body.fullname && (update.fullname = ctx.request.body.fullname)
            ctx.request.body.age && (update.age = ctx.request.body.age)
            ctx.request.body.address && (update.address = ctx.request.body.address)
            ctx.request.body.phone && (update.phone = ctx.request.body.phone)
            ctx.request.body.message && (update.message = ctx.request.body.message)
            ctx.request.body.sex && (update.sex = ctx.request.body.sex)
            // 加密
            if(update.password !== undefined){
                const salt = bcrypt.genSaltSync(10)
                const hash = bcrypt.hashSync(update.password, salt)
                update.password = hash
            }
            // 存储到数据库
            await Admins.findByIdAndUpdate(ctx.request.body._id, update, { new: true })
            // 向客户端返回数据
            ctx.status = 200
            ctx.body = {
                status : ctx.status,
                success:true,
                data:{
                    update
                },
                msg:'用户信息更新成功'
            }
        }
        }
})
/**
 * @route POST api/admins/updatePassword
 * @description 修改管理员密码
 * @access      接口公开
 */
adminsRouter.post('/updatePassword',async (ctx) =>{
    const _id = ctx.request.body._id
    // 查看是否有该用户
    const findAdmin = await Admins.findOne({
        _id
    })
    // 没有此用户时
    if(!findAdmin){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'用户不存在！',
            success:false
        }
    }else{
        // 查到用户后验证密码
        const password = ctx.request.body.oldPassword
        const compaireResult = bcrypt.compareSync(password, findAdmin.password)
        // 密码正确
        if(compaireResult){
            // 对新密码进行加密
            // 加密
            const salt = bcrypt.genSaltSync(10)
            const hash = bcrypt.hashSync(ctx.request.body.newPassword, salt)
            // 对管理员数据库进行更新
            const updateAdminPassword = {password:hash}
            await Admins.findByIdAndUpdate(_id,updateAdminPassword)
            ctx.status = 200
            ctx.body = {
                status:ctx.status,
                success:true,
                msg:'密码修改成功',
            }
        }else{
            ctx.status = 403
            ctx.body = {
                status:ctx.status,
                success:false,
                msg:'原密码错误！'
            }
        }
        
    }
})
/**
 * @route GET api/admins/adminsQuery
 * @description 根据用户名称进行查询（使用模糊查询）
 * @access      接口公开
 */
adminsRouter.get('/adminsQuery',async (ctx)=>{
    // 进行模糊查询
    const name =  new RegExp(ctx.query.name, 'i');
    const findData = await Admins.find(
        {name: name }, null,{
        limit:ctx.query.pageSize == 'undefined' ? 20 : ctx.request.query.pageSize,
        skip: ctx.query.page == 'undefined' ? 0 :(ctx.request.query.page-1) * ctx.request.query.pageSize
        }
    )
    if(findData.length ==0){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'没有此用户！',
            success:false
        }
    }else{
        // 向客户端返回数据
        ctx.status = 200
        ctx.body = {
            status:ctx.status,
            success:true,
            data:{
                findData
            },
            msg:'数据返回成功'
        }
    }
})
/**
 * @route POST api/admins/delete
 * @description 删除管理员信息接口
 * @access      接口公开
 */
adminsRouter.post('/delete',async (ctx) =>{
    const _id = ctx.request.body.id
    // 操作数据库,获取管理员信息
    const data = await Admins.findOne({ 
        _id
    })
    if(!data){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'该管理员不存在！',
            success:false
        }
    }else{
        await Admins.remove({_id})
        ctx.status = 200
        ctx.body = {
            status:ctx.status,
            msg:'管理员删除成功！',
            success:true,
        }
    }
})
/**
 * @route GET api/admins/roleList
 * @description 获取管理员角色列表
 * @access      接口公开
 */
adminsRouter.get('/roleList',async (ctx) =>{
    ctx.body = {
        status:200,
        success:true,
        data:[
            {
                id:1,
                title:"老板",
                describe:"唯一账号，可以操作系统所有功能"
            },
            {
                id:2,
                title:"管理员",
                describe:"由超管指定，可以为多个，协助超管管理系统"
            },
            {
                id:3,
                title:"员工",
                describe:"普通员工,只能进行普通操作"
            }
        ],
        message:"获取资料成功"
    }
})
/**
 * @route GET api/admins/roleList
 * @description 获取管理员角色列表
 * @access      接口公开
 */
adminsRouter.get('/userRoles',async (ctx) =>{
    const _id = ctx.query.id
    // 操作数据库,获取管理员信息
    const data = await Admins.findOne({ 
        _id
    })
    if(!data){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'该管理员不存在！',
            success:false
        }
    }else{
        ctx.body = {
            status:200,
            success:true,
            data:{
                role:data.role
            },
            message:"获取资料成功"
        }
    }
})
/**
 * @route GET api/admins/updateRole
 * @description 更新管理员角色列表
 * @access      接口公开
 */
adminsRouter.post('/updateRole',async (ctx) =>{
    const _id = ctx.request.body.id
    const role = ctx.request.body.roles
    // 操作数据库,获取管理员信息
    const data = await Admins.findOne({ 
        _id
    })
    if(!data){
        ctx.status = 403
        ctx.body = {
            status:ctx.status,
            msg:'该管理员不存在！',
            success:false
        }
    }else{
        // 获取该角色的所有信息
        const roleData = await Roles.findOne({title:role})
         // 定义所有权限的对象，根据不用的key返回不同的value
         const permissionsList = {
            "1":"storeRevenue",
            "2":"adminManage",
            "3":"roleList",
            "4":"permissionList",
            "5":"flowerManage",
            "6":"flowerType",
            "7":"userManage",
            // "7":"commodityOrderManage",
            "8":"UnshippedCommodityOrderManage",
            "9":"shippedCommodityOrderManage",
            "10":"completedCommodityOrderManage"
        }
         // 定义权限名称的数组
        const permissionArray = []
        // 对传过来的key进行遍历，向权限名称的数组中传入key所对应的value
        roleData.permissions.forEach(item =>{
            permissionArray.push(permissionsList[item])
        })
        // 对角色进行更新
        const updateRoles = {role,permissions:permissionArray}
        // 对管理员数据库进行更新
        await Admins.findByIdAndUpdate(_id,updateRoles)
        ctx.body = {
            status:200,
            success:true,
            data:{
                role:data.role
            },
            message:"更新角色成功"
        }
    }
})
/**
 * @route GET api/admins/permissionList
 * @description 获取管理员权限列表
 * @access      接口公开
 */
adminsRouter.get('/permissionList',async (ctx) =>{
    ctx.body = {
        status:200,
        success:true,
        data:[
            {
                id:"1",
                permissionName:"店铺详情",
                permissionMark:"storeRevenue",
                permissionDesc:"通过一些可视化数据来让管理者更好的看出商铺的营收情况",
            },
            {
                id:"2",
                permissionName:"员工管理",
                permissionMark:"adminManage",
                permissionDesc:"员工管理菜单",
                // children:[
                //     {
                //         id:"1-1",
                //         permissionName:"分配角色",
                //         permissionMark:"distributeRole",
                //         permissionDesc:"为员工分配角色"
                //     },
                //     {
                //         id:"1-2",
                //         permissionName:"导入员工",
                //         permissionMark:"importUser",
                //         permissionDesc:"通过 excel 导入员工"
                //     },
                //     {
                //         id:"1-3",
                //         permissionName:"删除员工",
                //         permissionMark:"removeUser",
                //         permissionDesc:"删除员工"
                //     }
                // ]
            },
            {
                id:"3",
                permissionName:"角色列表",
                permissionMark:"roleList",
                permissionDesc:"角色列表菜单",
                // children:[
                //     {
                //         id:"2-1",
                //         permissionName:"分配权限",
                //         permissionMark:"distributePermission",
                //         permissionDesc:"为角色分配权限"
                //     }
                // ]
            },
            {
                id:"4",
                permissionName:"权限列表",
                permissionMark:"permissionList",
                permissionDesc:"权限列表菜单",
                children:[
    
                ]
            },
            {
                id:"5",
                permissionName:"鲜花信息",
                permissionMark:"flowerManage",
                permissionDesc:"鲜花信息管理，用于对鲜花的信息进行修改",
                children:[
    
                ]
            },
            {
                id:"6",
                permissionName:"鲜花种类",
                permissionMark:"flowerType",
                permissionDesc:"鲜花种类管理，用来对鲜花的种类进行调整",
                children:[
    
                ]
            },
            {
                id:"7",
                permissionName:"用户管理",
                permissionMark:"userManage",
                permissionDesc:"用户信息管理,用来管理和查看用户的信息",
                children:[
    
                ]
            },
            // {
            //     id:"7",
            //     permissionName:"订单管理",
            //     permissionMark:"commodityOrderManage",
            //     permissionDesc:"商品订单信息管理,店铺员工可以在此处理商品订单",
            //     children:[
    
            //     ]
            // },
            {
                id:"8",
                permissionName:"未发货商品订单管理",
                permissionMark:"UnshippedCommodityOrderManage",
                permissionDesc:"未发货商品订单信息管理,店铺员工可以在此处理商品订单",
                children:[
    
                ]
            },
            {
                id:"9",
                permissionName:"已发货商品订单管理",
                permissionMark:"shippedCommodityOrderManage",
                permissionDesc:"已发货商品订单信息管理,店铺员工可以在此处理商品订单",
                children:[
    
                ]
            },
            {
                id:"10",
                permissionName:"已完成商品订单管理",
                permissionMark:"completedCommodityOrderManage",
                permissionDesc:"已完成商品订单信息管理,店铺员工可以在此对完成的商品订单进行查看",
                children:[
    
                ]
            },
        ],
        message:"获取资料成功"
    }
})
/**
 * @route GET api/admins/current
 * @description 管理员信息接口 返回管理员信息
 * @access      接口私密 需要token
 */
adminsRouter.get(
    '/getAdminInfo',
    passport.authenticate('jwt', { session: false }),
    async (ctx) => {
      ctx.status = 200
      ctx.body = {
        status: ctx.status,
        success:true,
        data: {
          _id: ctx.state.user._id,
          name: ctx.state.user.name,
          age: ctx.state.user.age,
          address: ctx.state.user.address,
          phone: ctx.state.user.phone,
          sex:ctx.state.user.sex,
          workNumber:ctx.state.user.workNumber, //工号
          super:ctx.state.user.super, // 超级管理员
          role:ctx.state.user.role, // 角色
          permissions:ctx.state.user.permissions, // 权限
        },
      }
    }
  )
module.exports = adminsRouter